Redis 的Java 客户端笔记整理

作者: 李多多 日期: 2020-06-29
Redis
Redis 的Java 客户端笔记整理

@[TOC](Redis 的Java 客户端笔记整理)

开启远程连接

redis 默认不支持远程连接,需手启:

修改地方 (找到 config)

  1. 把 bind:127.0.0.1 注释掉
  2. 密码校验开启 (去掉 requirepass 注解 在 vim 搜索:/requirepass,加上自己的密码)

ok 保存退出启redis。

Jedis (maven 篇) 基本使用

Jedis的Github地址:https://github.com/redis/jedis

1、创建 maven 项目,添加Jedis依赖:

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>

创建测试方法:

public class MyJedis {
public static void main(String[] args) {
// 1 new一个jedis对象 默认6379
Jedis jedis = new Jedis("192.168.1.132",6379);
// 2 密码认证
jedis.auth("java");
// 3 测试是否连通
String ping = jedis.ping();
// 4 返回PONG 说明连接成功
System.out.println(ping);

}
}

启动 main 方法,输出 PONG 则成功。

在 Jedis 中,由于方法的API 与 redis 命令高度一致。直接使用即可。

连接池

在实际应用中,Jedis 实例我们一般是通过连接池来获取,由于 Jedis 对象不是线程安全的,所以当我们使用 Jedis 对象时,从连接池获取 Jedis ,使用完成后,再还给连接池。

public class JedisPoolTest {
public static void main(String[] args) {
Jedis jedis = null;
//1.构造一个 jedis 连接池
JedisPool pool = new JedisPool("192.168.1.132", 6379);
//2. 从连接池中获取一个 jedis 连接
jedis = pool.getResource();
jedis.auth("javaboy");
try {
//3. Jedis 操作
String ping = jedis.ping();
System.out.println(ping);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
//4. 归还连接
jedis.close();
}
}
}
}

进一步改进:

public class Redis {
private JedisPool pool;

public Redis(){
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
//连接池最大空闲数
config.setMaxIdle(300);
//最大连接数
config.setMaxTotal(1000);
//连接最大等待时间,如果是 -1 表示没有限制
config.setMaxWaitMillis(30000);
//在空闲时检测有效性
config.setTestOnBorrow(true);
/**
* 1.Redis 地址
* 2.redis 端口
* 3.连接超时时间
* 4.密码
*/
pool= new JedisPool(config,"192.168.1.132",6379,30000,"javaboy");

}

public void execute(CallwithJedis callwithJedis){
try(Jedis jedis = pool.getResource()){
callwithJedis.call(jedis);
}
}
}

public interface CallwithJedis {
void call(Jedis jedis);
}
//测试类
public class JedisPoolTest {
public static void main(String[] args) {
Redis redis = new Redis();
redis.execute(jedis -> {
System.out.println(jedis.ping());
})
}
}

Lettuce

Lettuce 和 Jedis 的区别

  1. Jedis 在实现的过程中是直接连接 Redis 的,在多个线程之间共享一个 Jedis 实例,这是线程不安全的,如果想在多线程场景下使用 Jedis,就得使用连接池,这样每个连接池都有自己的 Jedis 实例。
  2. Lettuce 基于 Netty NIO 框架来构建,所以克服了 Jedis 中线程不安全的问题, Lettuce 支持同步、异步以及响应式调用,多个线程可以共享一个连接实例。

使用 Lettuce ,首先创建一个 Maven 项目,添加 Lettuce 依赖:

<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>

简单测试:

public class LettuceTest {
public static void main(String[] args) {

//这里密码直接写在连接池里,在 @ 前
RedisClient redisClient = RedisClient.create("redis://javaboy@192.168.1.132");
StatefulRedisConnection<String, String> connect = redisClient.connect();
RedisCommands<String, String> sync = connect.sync();
sync.set("name","lisi");
String name = sync.get("name");
System.out.println(name);
}
}